#include <cstdio>
#include <algorithm>
#include <cstring>
#include <map>
#include <queue>
using namespace std;
const int N=2050;
const int INF=0x3f3f3f3f;
map<char,int> dic;
int dp[2050][2050];
struct Trie{
    int Next[N][4];
    int fail[N];
    int end[N];
    int root;
    int L;
    int newNode(){
        for(int i=0;i<4;i++){
            Next[L][i]=-1;
        }
        end[L++]=0;
        return L-1;
    }
    void init(){
        memset(Next,0,sizeof(Next));
        memset(fail,0,sizeof(fail));
        memset(end,0,sizeof(end));
        memset(dp,0,sizeof(dp));
        dic['A']=0;
        dic['C']=1;
        dic['G']=2;
        dic['T']=3;
        L=0;
        root=newNode();
    }
    void insert(char *buf){
        int l=strlen(buf);
        int now=root;
        for(int i=0;i<l;i++){
            if(Next[now][dic[buf[i]]]==-1){
                Next[now][dic[buf[i]]]=newNode();
            }
            now=Next[now][dic[buf[i]]];
        }
        end[now]++;
    }
    void build(){
        queue<int> q;
        fail[root]=root;
        for(int i=0;i<4;i++){
            if(Next[root][i]==-1){
                Next[root][i]=root;
            }
            else{
                fail[Next[root][i]]==root;
                q.push(Next[root][i]);
            }
        }
        while(!q.empty()){
            int now=q.front();
            q.pop();
            for(int i=0;i<4;i++){
                if(Next[now][i]==-1){
                    Next[now][i]=Next[fail[now]][i];
                }
                else{
                    fail[Next[now][i]]=Next[fail[now]][i];
                    q.push(Next[now][i]);
                }
            }
        }
    }
    int solve(char *str){
        int l=strlen(str);
        for(int i=0;i<=l;i++){
            for(int j=0;j<L;j++){
                dp[i][j]=INF;
            }
        }
        dp[0][root]=0;
        for(int i=0;i<l;i++){
            for(int j=root;j<L;j++){
                if(dp[i][j]!=INF){
                    for(int k=0;k<4;k++){
                        if(end[Next[j][k]]){
                            continue;
                        }
                        int tmp;
                        if(dic[str[i]]==k){
                            tmp=dp[i][j];
                        }
                        else{
                            tmp=dp[i][j]+1;
                        }
                        dp[i+1][Next[j][k]]=min(dp[i+1][Next[j][k]],tmp);
                    }
                }
            }
        }
        int Min=INF;
        for(int i=0;i<L;i++){
            Min=min(Min,dp[l][i]);
        }
        if(Min==INF){
            return -1;
        }
        else{
            return Min;
        }
    }
}ac;
char s[30],ss[1050];
int n;
int main(void){
    int c=1;
    while(~scanf("%d",&n) && n){
        ac.init();
        for(int i=0;i<n;i++){
            scanf("%s",s);
            ac.insert(s);       
        }
        ac.build();
        scanf("%s",ss);
        printf("Case %d: %d\n",c++,ac.solve(ss));
    }
    return 0;
}